bitkeeper revision 1.1159.1.238 (4170032cpg2cImDyZBh7B0OJ5MVrTg)
authorsos22@douglas.cl.cam.ac.uk <sos22@douglas.cl.cam.ac.uk>
Fri, 15 Oct 2004 17:04:44 +0000 (17:04 +0000)
committersos22@douglas.cl.cam.ac.uk <sos22@douglas.cl.cam.ac.uk>
Fri, 15 Oct 2004 17:04:44 +0000 (17:04 +0000)
It turns out that Xen hypercalls actually clobber the registers used to pass in their arguments (some of the time, at least).  Correct the
asm in hypervisor.h to allow for this.

BitKeeper/etc/logging_ok
linux-2.6.8.1-xen-sparse/include/asm-xen/hypervisor.h

index 9ec3ca7ee9d6b38a718a91e0cd49bd8bb7e51663..65cb94b67bacfba6c47e69e8f4a82534a00d2e21 100644 (file)
@@ -47,6 +47,7 @@ smh22@boulderdash.cl.cam.ac.uk
 smh22@labyrinth.cl.cam.ac.uk
 smh22@tempest.cl.cam.ac.uk
 smh22@uridium.cl.cam.ac.uk
+sos22@douglas.cl.cam.ac.uk
 sos22@labyrinth.cl.cam.ac.uk
 tlh20@elite.cl.cam.ac.uk
 tlh20@labyrinth.cl.cam.ac.uk
index f62536172915c9e2b6f4c831d36ed5351efb8eac..b2ed1c164de1477254cb36003b5d16012b15918c 100644 (file)
@@ -186,10 +186,13 @@ HYPERVISOR_set_trap_table(
     trap_info_t *table)
 {
     int ret;
+    unsigned long ignore;
+
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_set_trap_table),
-        "b" (table) : "memory" );
+        : "=a" (ret), "=b" (ignore)
+       : "0" (__HYPERVISOR_set_trap_table), "1" (table)
+       : "memory" );
 
     return ret;
 }
@@ -199,10 +202,14 @@ HYPERVISOR_mmu_update(
     mmu_update_t *req, int count, int *success_count)
 {
     int ret;
+    unsigned long ign1, ign2, ign3;
+
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_mmu_update), 
-        "b" (req), "c" (count), "d" (success_count) : "memory" );
+        : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3)
+       : "0" (__HYPERVISOR_mmu_update), "1" (req), "2" (count),
+         "3" (success_count)
+       : "memory" );
 
     return ret;
 }
@@ -212,10 +219,13 @@ HYPERVISOR_set_gdt(
     unsigned long *frame_list, int entries)
 {
     int ret;
+    unsigned long ign1, ign2;
+
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_set_gdt), 
-        "b" (frame_list), "c" (entries) : "memory" );
+        : "=a" (ret), "=b" (ign1), "=c" (ign2)
+       : "0" (__HYPERVISOR_set_gdt), "1" (frame_list), "2" (entries)
+       : "memory" );
 
 
     return ret;
@@ -226,10 +236,13 @@ HYPERVISOR_stack_switch(
     unsigned long ss, unsigned long esp)
 {
     int ret;
+    unsigned long ign1, ign2;
+
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_stack_switch),
-        "b" (ss), "c" (esp) : "memory" );
+        : "=a" (ret), "=b" (ign1), "=c" (ign2)
+       : "0" (__HYPERVISOR_stack_switch), "1" (ss), "2" (esp)
+       : "memory" );
 
     return ret;
 }
@@ -240,11 +253,14 @@ HYPERVISOR_set_callbacks(
     unsigned long failsafe_selector, unsigned long failsafe_address)
 {
     int ret;
+    unsigned long ign1, ign2, ign3, ign4;
+
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_set_callbacks),
-        "b" (event_selector), "c" (event_address), 
-        "d" (failsafe_selector), "S" (failsafe_address) : "memory" );
+        : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4)
+       : "0" (__HYPERVISOR_set_callbacks), "1" (event_selector),
+         "2" (event_address), "3" (failsafe_selector), "4" (failsafe_address)
+       : "memory" );
 
     return ret;
 }
@@ -266,10 +282,13 @@ HYPERVISOR_yield(
     void)
 {
     int ret;
+    unsigned long ign;
+
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_sched_op),
-        "b" (SCHEDOP_yield) : "memory" );
+        : "=a" (ret), "=b" (ign)
+       : "0" (__HYPERVISOR_sched_op), "1" (SCHEDOP_yield)
+       : "memory" );
 
     return ret;
 }
@@ -279,10 +298,12 @@ HYPERVISOR_block(
     void)
 {
     int ret;
+    unsigned long ign1;
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_sched_op),
-        "b" (SCHEDOP_block) : "memory" );
+        : "=a" (ret), "=b" (ign1)
+       : "0" (__HYPERVISOR_sched_op), "1" (SCHEDOP_block)
+       : "memory" );
 
     return ret;
 }
@@ -292,10 +313,12 @@ HYPERVISOR_shutdown(
     void)
 {
     int ret;
+    unsigned long ign1;
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_sched_op),
-        "b" (SCHEDOP_shutdown | (SHUTDOWN_poweroff << SCHEDOP_reasonshift))
+        : "=a" (ret), "=b" (ign1)
+       : "0" (__HYPERVISOR_sched_op),
+         "1" (SCHEDOP_shutdown | (SHUTDOWN_poweroff << SCHEDOP_reasonshift))
         : "memory" );
 
     return ret;
@@ -306,10 +329,12 @@ HYPERVISOR_reboot(
     void)
 {
     int ret;
+    unsigned long ign1;
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_sched_op),
-        "b" (SCHEDOP_shutdown | (SHUTDOWN_reboot << SCHEDOP_reasonshift))
+        : "=a" (ret), "=b" (ign1)
+       : "0" (__HYPERVISOR_sched_op),
+         "1" (SCHEDOP_shutdown | (SHUTDOWN_reboot << SCHEDOP_reasonshift))
         : "memory" );
 
     return ret;
@@ -320,12 +345,15 @@ HYPERVISOR_suspend(
     unsigned long srec)
 {
     int ret;
+    unsigned long ign1, ign2;
+
     /* NB. On suspend, control software expects a suspend record in %esi. */
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_sched_op),
+        : "=a" (ret), "=b" (ign1), "=S" (ign2)
+       : "0" (__HYPERVISOR_sched_op),
         "b" (SCHEDOP_shutdown | (SHUTDOWN_suspend << SCHEDOP_reasonshift)), 
-        "S" (srec) : "memory" );
+        "S" (srec) : "memory");
 
     return ret;
 }
@@ -337,10 +365,13 @@ HYPERVISOR_set_timer_op(
     int ret;
     unsigned long timeout_hi = (unsigned long)(timeout>>32);
     unsigned long timeout_lo = (unsigned long)timeout;
+    unsigned long ign1, ign2;
+
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_set_timer_op),
-        "b" (timeout_hi), "c" (timeout_lo) : "memory" );
+        : "=a" (ret), "=b" (ign1), "=c" (ign2)
+       : "0" (__HYPERVISOR_set_timer_op), "b" (timeout_hi), "c" (timeout_lo)
+       : "memory");
 
     return ret;
 }
@@ -350,11 +381,14 @@ HYPERVISOR_dom0_op(
     dom0_op_t *dom0_op)
 {
     int ret;
+    unsigned long ign1;
+
     dom0_op->interface_version = DOM0_INTERFACE_VERSION;
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_dom0_op),
-        "b" (dom0_op) : "memory" );
+        : "=a" (ret), "=b" (ign1)
+       : "0" (__HYPERVISOR_dom0_op), "1" (dom0_op)
+       : "memory");
 
     return ret;
 }
@@ -364,10 +398,12 @@ HYPERVISOR_set_debugreg(
     int reg, unsigned long value)
 {
     int ret;
+    unsigned long ign1, ign2;
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_set_debugreg),
-        "b" (reg), "c" (value) : "memory" );
+        : "=a" (ret), "=b" (ign1), "=c" (ign2)
+       : "0" (__HYPERVISOR_set_debugreg), "1" (reg), "2" (value)
+       : "memory" );
 
     return ret;
 }
@@ -377,10 +413,12 @@ HYPERVISOR_get_debugreg(
     int reg)
 {
     unsigned long ret;
+    unsigned long ign;
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_get_debugreg),
-        "b" (reg) : "memory" );
+        : "=a" (ret), "=b" (ign)
+       : "0" (__HYPERVISOR_get_debugreg), "1" (reg)
+       : "memory" );
 
     return ret;
 }
@@ -390,10 +428,14 @@ HYPERVISOR_update_descriptor(
     unsigned long ma, unsigned long word1, unsigned long word2)
 {
     int ret;
+    unsigned long ign1, ign2, ign3;
+
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_update_descriptor), 
-        "b" (ma), "c" (word1), "d" (word2) : "memory" );
+        : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3)
+       : "0" (__HYPERVISOR_update_descriptor), "1" (ma), "2" (word1),
+         "3" (word2)
+       : "memory" );
 
     return ret;
 }
@@ -403,10 +445,13 @@ HYPERVISOR_set_fast_trap(
     int idx)
 {
     int ret;
+    unsigned long ign;
+
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_set_fast_trap), 
-        "b" (idx) : "memory" );
+        : "=a" (ret), "=b" (ign)
+       : "0" (__HYPERVISOR_set_fast_trap), "1" (idx)
+       : "memory" );
 
     return ret;
 }
@@ -417,11 +462,14 @@ HYPERVISOR_dom_mem_op(
     unsigned long nr_extents, unsigned int extent_order)
 {
     int ret;
+    unsigned long ign1, ign2, ign3, ign4, ign5;
+
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_dom_mem_op),
-        "b" (op), "c" (extent_list), "d" (nr_extents), "S" (extent_order),
-       "D" (DOMID_SELF)
+        : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4),
+         "=D" (ign5)
+       : "0" (__HYPERVISOR_dom_mem_op), "1" (op), "2" (extent_list),
+         "3" (nr_extents), "4" (extent_order), "5" (DOMID_SELF)
         : "memory" );
 
     return ret;
@@ -432,10 +480,13 @@ HYPERVISOR_multicall(
     void *call_list, int nr_calls)
 {
     int ret;
+    unsigned long ign1, ign2;
+
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_multicall),
-        "b" (call_list), "c" (nr_calls) : "memory" );
+        : "=a" (ret), "=b" (ign1), "=c" (ign2)
+       : "0" (__HYPERVISOR_multicall), "1" (call_list), "2" (nr_calls)
+       : "memory" );
 
     return ret;
 }
@@ -445,10 +496,14 @@ HYPERVISOR_update_va_mapping(
     unsigned long page_nr, pte_t new_val, unsigned long flags)
 {
     int ret;
+    unsigned long ign1, ign2, ign3;
+
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_update_va_mapping), 
-        "b" (page_nr), "c" ((new_val).pte_low), "d" (flags) : "memory" );
+        : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3)
+       : "0" (__HYPERVISOR_update_va_mapping), 
+          "1" (page_nr), "2" ((new_val).pte_low), "3" (flags)
+       : "memory" );
 
     if ( unlikely(ret < 0) )
     {
@@ -465,10 +520,12 @@ HYPERVISOR_event_channel_op(
     void *op)
 {
     int ret;
+    unsigned long ignore;
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_event_channel_op),
-        "b" (op) : "memory" );
+        : "=a" (ret), "=b" (ignore)
+       : "0" (__HYPERVISOR_event_channel_op), "1" (op)
+       : "memory" );
 
     return ret;
 }
@@ -478,10 +535,13 @@ HYPERVISOR_xen_version(
     int cmd)
 {
     int ret;
+    unsigned long ignore;
+
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_xen_version), 
-        "b" (cmd) : "memory" );
+        : "=a" (ret), "=b" (ignore)
+       : "0" (__HYPERVISOR_xen_version), "1" (cmd)
+       : "memory" );
 
     return ret;
 }
@@ -491,10 +551,12 @@ HYPERVISOR_console_io(
     int cmd, int count, char *str)
 {
     int ret;
+    unsigned long ign1, ign2, ign3;
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_console_io),
-        "b" (cmd), "c" (count), "d" (str) : "memory" );
+        : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3)
+       : "0" (__HYPERVISOR_console_io), "1" (cmd), "2" (count), "3" (str)
+       : "memory" );
 
     return ret;
 }
@@ -504,10 +566,13 @@ HYPERVISOR_physdev_op(
     void *physdev_op)
 {
     int ret;
+    unsigned long ign;
+
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_physdev_op),
-        "b" (physdev_op) : "memory" );
+        : "=a" (ret), "=b" (ign)
+       : "0" (__HYPERVISOR_physdev_op), "1" (physdev_op)
+       : "memory" );
 
     return ret;
 }
@@ -517,10 +582,13 @@ HYPERVISOR_grant_table_op(
     unsigned int cmd, void *uop, unsigned int count)
 {
     int ret;
+    unsigned long ign1, ign2, ign3;
+
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_grant_table_op),
-        "b" (cmd), "c" (count), "d" (uop) : "memory" );
+        : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3)
+       : "0" (__HYPERVISOR_grant_table_op), "1" (cmd), "2" (count), "3" (uop)
+       : "memory" );
 
     return ret;
 }
@@ -530,10 +598,13 @@ HYPERVISOR_update_va_mapping_otherdomain(
     unsigned long page_nr, pte_t new_val, unsigned long flags, domid_t domid)
 {
     int ret;
+    unsigned long ign1, ign2, ign3, ign4;
+
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_update_va_mapping_otherdomain), 
-        "b" (page_nr), "c" ((new_val).pte_low), "d" (flags), "S" (domid) :
+        : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4)
+       : "0" (__HYPERVISOR_update_va_mapping_otherdomain),
+          "1" (page_nr), "2" ((new_val).pte_low), "3" (flags), "4" (domid) :
         "memory" );
     
     return ret;
@@ -544,10 +615,13 @@ HYPERVISOR_vm_assist(
     unsigned int cmd, unsigned int type)
 {
     int ret;
+    unsigned long ign1, ign2;
+
     __asm__ __volatile__ (
         TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_vm_assist),
-        "b" (cmd), "c" (type) : "memory" );
+        : "=a" (ret), "=b" (ign1), "=c" (ign2)
+       : "0" (__HYPERVISOR_vm_assist), "1" (cmd), "2" (type)
+       : "memory" );
 
     return ret;
 }